import React from 'react'
import Importer from 'components/template/importer/index'
import {Button} from 'antd'
import {messages} from "share/common";

export default {
  key: 'Importer',
  name: 'Importer 导入',
  author: '陈行健',
  description: '导入模板合并组件',
  isExampleFull: true,
  api: [
    {
      title: 'API',
      description: '',
      data: [
        {
          param: 'parseUploadResult',
          description: '格式化导入结果文案',
          type: 'func',
          defaultValue: 'uploadResult => `导入成功：${uploadResult.successEntities || 0}条，导入失败：${uploadResult.failureEntities || 0}条`\n' +
            ' };\n' +
            ' \n' +
            ' function mapStateToProps() {\n'
        },
        {
          param: 'triggerNode',
          description: '触发器，支持自定义触发器元素，或多个元素数组，会把外部点击事件与内置点击事件合并',
          type: '[ReactNode]| ReactNode'
        },
        {
          param: 'btnName',
          description: '内置按钮文案，如果不设置::triggerNode::,则需要设置::btnName::',
          type: 'string',
          defaultValue: '导入'
        },
        {
          param: 'btnProps',
          description: '内置按钮属性',
          type: 'object',
          defaultValue: '{type: "primary"}'
        },
        {
          param: 'modalOptions',
          description: '弹窗相关参数，除了::visible::外同antd::Modal::',
          type: 'object',
          defaultValue: 'modalOptions: {\n' +
            '    title: messages(\'common.import\')/*\'导入\'*/\n' +
            '  }'
        },
        {
          param: 'template',
          description: '自定义左侧创建模板部分',
          type: '::string::||::ReactNode::',
          defaultValue: '-'
        },
        {
          param: 'templateOptions',
          description: '下载模板相关参数，详见下方',
          type: 'object',
          defaultValue: 'templateOptions: {\n' +
            '    templateList: [{\n' +
            '      downloadUrl: \'\', //模板下载地址\n' +
            '      downFileName: \'\', //模板下载后文件名\n' +
            '      templateName: \'\', //模板显示文件名\n' +
            '      downFileExtension: \'xlsx\' //模板后缀\n' +
            '    }],\n' +
            '    templateTips: \'\' //模板提示\n' +
            '  },'
        },
        {
          param: 'uploadOptions',
          description: '上传模板相关参数，详见下方',
          type: 'object',
          defaultValue: 'uploadOptions: {\n' +
            '    maxNum: 1,\n' +
            '    uploadParams:{},\n' +
            '    uploadUrl: \'/api/upload/attachment/v2\',\n' +
            '    listenUrl: `${config.budgetUrl}/api/budget/batch/transaction/logs`,\n' +
            '    accept: \'\',\n' +
            '    props: \'\'\n' +
            '  }'
        },
        {
          param: 'asyncMode',
          description: '是否是异步上传方式，如果是则需要定义异步上传后的提示信息::asyncModeMessage::，上传后不会等待结果，直接跳转至::上传结果::tab',
          type: 'bool',
          defaultValue: 'false'
        },
        {
          param: 'asyncModeMessage',
          description: '定义为异步上传后，上传结果tab的提示信息',
          type: '::string::||::ReactNode::',
          defaultValue: 'false'
        },
        {
          param: 'uploadResultOptions',
          description: '导入结果相关参数，详见下方',
          type: 'object',
          defaultValue: '-'
        },
        {
          param: 'onValidate',
          description: '导入文件前的其他校验，组件内部只能通过::uploadOptions::属性配置文件最大体积和最多上传数量，其余的校验可通过该函数自行配置',
          type: '(fileList: Array) => bool',
          defaultValue: '-'
        },
        {
          param: 'beforeUpload',
          description: '导入文件前对文件对象的相关处理，注意：只能处理文件Object,不能通过返回false阻止文件上传，如果想对文件内容做校验中断上传，请使用::onValidate::',
          type: '(file: object) => object',
          defaultValue: '-'
        },
        {
          param: 'infoMessage',
          description: '提示信息，配置后将长在模态框上方，若配置为::string::，则默认显示为::Alert::组件，支持自定义::ReactNode::',
          type: '::string::||::ReactNode::',
          defaultValue: '-'
        },
        {
          param: 'errorTableData',
          description: '导入结果错误信息表格数据',
          type: 'function',
          defaultValue: 'errorTableData: data => {\n' +
            '    return data && data.detailPage ? data.detailPage.content.map(i => {\n' +
            '      i.index = i.lineNumber;\n' +
            '      i.error = i.errorMessage;\n' +
            '      return i;\n' +
            '    }) : []\n' +
            '  }'
        },
        {
          param: 'totalError',
          description: '导入结果错误信息总条数，当表格分页时需要配置',
          type: 'function',
          defaultValue: 'totalError: data => data && data.detailPage ? data.detailPage.totalElements : 0'
        },
        {
          param: 'errorColumns',
          description: '导入结果错误信息表格::columns::',
          type: 'array',
          defaultValue: 'errorColumns: [\n' +
            '    {title: messages(\'components.key471\'/*行号*/), dataIndex: \'index\', width: \'13%\'},\n' +
            '    {title: messages(\'components.key472\'/*错误信息*/), dataIndex: \'error\'}\n' +
            '  ]'
        },
        {
          param: 'onConfirmUpload',
          description: '部分上传接口需要调用两次，第一次确认结果，第二次再正式上传，用于兼容这部分业务',
          type: 'function',
          defaultValue: '-'
        },
        {
          param: 'onOk',
          description: '上传完成后，点关闭按钮的回调，如果上传返回的参数中有::transactionOID::,会传递回去',
          type: 'function',
          defaultValue: '-'
        }
      ],
    },
    {
      title: 'templateOptions API',
      description: '包括模板列表::templateList::, 模板下载提示::templateTips::, 下载按钮相关的其余::props::',
      data: [
        {
          param: 'templateList',
          description: '模板列表, ::downloadUrl::模板下载地址，支持静态文件地址，::downFileName::下载文件名，::templateName::展示的模板文件名（如果下载文件名和展示的文件名一样只需配置一个），::downFileExtension::下载文件后缀，::templateTips::模板提示语, ::downloadMethod::下载方式，默认get, ::downloadParams::下载附带参数',
          type: '[{downloadUrl: ::string::,  downFileName: ::string::, templateName: ::string::, downFileExtension: ::string::, templateTips: ::string::, downloadMethod: ::string::， downloadParams：::object::}]',
          defaultValue: '-'
        },
        {
          param: 'templateTips',
          description: '下载模板提示，注意：该属性配置的是下载模板的整体提示，长在创建模板步骤的下方，若需要对单个模板进行配置请使用::templateList::中的::templateTips::',
          type: '::string::||::ReactNode::',
          defaultValue: '-'
        },
        {
          param: 'onDownloadTemplate',
          description: '自定义下载模板，消费商的部分接口是下载文件到本地返回本地文件路径，然后直接window.open, 需返回promise对象',
          type: 'Promise',
          defaultValue: '-'
        },
        {
          param: 'props',
          description: '下载按钮相关的::props::，可以覆盖组件内定义的其他属性，如果有多个模板，注意这里的::props::是针对整体的，而不能对单个下载按钮配置',
          type: 'object',
          defaultValue: '-'
        }
      ]
    },
    {
      title: 'uploadOptions API',
      description: '',
      data: [
        {
          param: 'maxNum',
          description: '支持上传模板的最大数量',
          type: 'number',
          defaultValue: '1'
        },
        {
          param: 'maxFileSize',
          description: '支持上传模板的最大体积，单位::M::',
          type: 'number',
          defaultValue: '-'
        },
        {
          param: 'uploadParams',
          description: '上传参数,会以::form-data::的形式，附在上传接口的请求参数值中',
          type: 'object',
          defaultValue: '{}'
        },
        {
          param: 'uploadUrl',
          description: '上传路径',
          type: 'string',
          defaultValue: '/api/upload/attachment/v2'
        },
        {
          param: 'props',
          description: '同antd组件::Upload::的属性，可覆盖组件中定义的其余参数',
          type: 'object',
          defaultValue: '-'
        },
        {
          param: 'accept',
          description: '支持的有效文件格式',
          type: '可参考constant.js ::acceptFileTypes::',
          defaultValue: 'application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        },
        {
          param: 'disabled',
          description: '禁用上传',
          type: 'bool',
          defaultValue: 'false'
        },
        {
          param: 'parseUploadResult',
          description: '解析上传结果, 返回一个上传结果的标准对象',
          type: '(data) => {successEntities, failureEntities}',
          defaultValue: '-'
        }
      ],
    },
    {
      title: 'uploadResultOptions API',
      description: '',
      data: [
        {
          param: 'shouldDownloadErrorInfo',
          description: '是否显示下载错误信息按钮，若展示，需要配置::errorUrl::并且默认上传接口返回了::transactionOID::',
          type: 'bool',
          defaultValue: 'false'
        },
        {
          param: 'errorUrl',
          description: '下载错误信息路径',
          type: 'string',
          defaultValue: '-'
        },
        {
          param: 'errorParams',
          description: '下载错误信息的接口参数',
          type: 'object',
          defaultValue: '-'
        },
        {
          param: 'templateName',
          description: '下载错误信息文件的文件名，会在后面自动拼接"错误信息"',
          type: 'string',
          defaultValue: '-'
        },
        {
          param: 'downFileExtension',
          description: '下载错误信息文件后缀',
          type: 'string',
          defaultValue: 'xlsx'
        },
        {
          param: 'reimportable',
          description: '是否支持在导入失败后返回上一个tab重新导入，导入失败的定义同::getErrorTableVisible::',
          type: 'bool',
          defaultValue: '-'
        },
        {
          param: 'getErrorTableVisible',
          description: '是否展示错误信息表格',
          type: '({successEntities: number, failureEntities: number}) => bool',
          defaultValue: '(uploadResult) => uploadResult && uploadResult.failureEntities > 10'
        },
        {
          param: 'queryMode',
          description: '下载错误信息的参数模式,若为true,下载路径后不直接拼接transactionOID，需自行处理errorParams',
          type: 'bool',
          defaultValue: 'false'
        },
      ]
    }
  ],

  example: [
    {
      title: '基础用法',
      description: '注意这里的测试会影响 用户与权限->员工 中的数据',
      state: {
        showImportModal: false
      },
      getMethod: context => {
        return {}
      },
      getContent: context => {
        let templates = [
          {
            downloadName: 'bank_info',
            templateName: messages('component-lib.key161')/*银行基础数据*/,
            downloadUrl: "http://helioscloud-uat-static.oss-cn-shanghai.aliyuncs.com/bank_info.xlsx",
            templateTips: messages('component-lib.key162')/*录入银行信息时请根据银行数据录入，该文件无须上传*/
          },
          {
            downloadName: messages('enterprise-manage.key307'/*人员信息导入模板*/),
            templateName: messages('enterprise-manage.key322'/*人员信息模板*/),
            downloadUrl: "/api/users/v2/fullInfo/template/export",
          }
        ];
        return (
          <div>
            <Importer
              modalOptions={{title: messages('common.import')/*导入*/, afterClose: () => context.onChange(false)}}
              btnName={messages('enterprise-manage.key328'/*导入人员数据*/)}
              infoMessage={messages('enterprise-manage.key397')/*主信息模板（必须导入）,包含个人基本信息、默认一套银行&证件信息、消费商信息补充信息模板（上传前必须先导入主数据）&证件信息*/}
              templateOptions={{
                templateList: templates
              }}
              uploadOptions={{
                uploadUrl: '/api/refactor/users/v2/info/import',
                listenUrl: '/api/batch/transaction/logs/v2'
              }}
              uploadResultOptions={{
                shouldDownloadErrorInfo: true,
                showErrorTable: true,
                errorUrl: '/api/batch/transaction/logs/failed/export',
                getErrorTableVisible: result => result && result.failureEntities > 0
              }}
            />
          </div>
        )
      }
    }
  ]
}
